const {
  readFile
} = require('fs')
const EventEmitter = require('events')

class EE extends EventEmitter {}

const yy = new EE()

yy.on('event', () => {
  console.log('hello !')
})

setTimeout(() => {
  console.log('0 毫秒后到期执行的定时器回调')
}, 0)

setTimeout(() => {
  console.log('100 毫秒后到期执行的定时器回调')
}, 100)

setTimeout(() => {
  console.log('200 毫秒后到期执行的定时器回调')
}, 200)

readFile('../package.json', 'utf-8', data => {
  console.log('完成文件 1 读操作的回调')
})

readFile('../README.md', 'utf-8', data => {
  console.log('完成文件 2 读操作的回调')
})


setImmediate(() => {
  console.log('immediate 立即回调')
})

process.nextTick(() => {
  console.log('process.nextTick 的回调')
})

Promise.resolve()
  .then(() => {
    yy.emit('event')

    process.nextTick(() => {
      console.log('process.nextTick 的第 2 次回调')
    })

    console.log('Promise 的第 1 次回调')
  })
  .then(() => {
    console.log('Promise 的第 2 次回调')
  })

/* 
process.nextTick 的回调
hello!
Promise 的第 1 次回调
Promise 的第 2 次回调
process.nextTick 的第 2 次回调
0 毫秒后到期执行的定时器回调
immediate 立即回调
完成文件 1 读操作的回调
完成文件 2 读操作的回调
100 毫秒后到期执行的定时器回调
200 毫秒后到期执行的定时器回调 
*/
  /**
   * process.nextTick 优先级高所以先打印 process.nextTick 的回调
   * 然后执行 Promise.resolve，在 Promise 里头触发了事件，所以打印了 hello!
   * 接着继续完成 Promise 的内容，所以打印了 Promise 的第 1 次回调 和 Promise 的第 2 次回调
   * 然后执行 Promise 中的 process.nextTick
   * 然后执行定时器之类的，setTimeout(fn, 0) 比 setImmediate() 快所以。
   * 因为定时器是延迟执行所以两次读取文件先于 setTimeout(fn, 100), setTimeout(fn, 200)
   */